package com.lzc.springPart.aop.cglb;

import org.springframework.cglib.core.Signature;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import javax.swing.plaf.synth.SynthOptionPaneUI;
import java.lang.reflect.Method;

/**
 * cglib代理总结
 * cglib代理对象中重写原始对象的方法并且调用invoke方法将proxy, method, args, methodProxy四个参数传过去
 *      proxy代表代理对象，
 *      method代表该方法对应的原始类的该方法的方法对象，
 *      args参数，
 *      methodProxy实现不通过反射调用原始方法
 * cglib代理对象中还会额外有对应每个方法的super方法，内容直接调用原始对象的方法，可用于methodProxy使用
 * methodProxy原理：在第一次创建的时候会生成对应该cglib代理对象的两个FastClass代理对象，用于不通过反射调用原始方法
 *             主要是通过方法签名获取到index 在 更具index调用原方法
 *
 * cglib 代理 -> methodProxy -> FastClass
 */

public class CglibProxyDemo{

    static class Cat{
        public void eat(){
            System.out.println("eat");
        }
    }

    public static void main(String[] args) {
        CglbImpl cglb = new CglbImpl((proxy, method, args1, methodProxy) -> {
            System.out.println("before");

            // 下面四部相当于methodProxy.invoke()
            Signature signature = methodProxy.getSignature();
            TargetFastClass targetFastClass = new TargetFastClass();
            int index = targetFastClass.getIndex(signature);
            return targetFastClass.invoke(index,new Cat(),args1);

        });

        cglb.eat();
    }
}
